www.gusucode.com > FTP工具FileZilla v2.2.4源代码-源码程序 > FTP工具FileZilla v2.2.4源代码-源码程序\code\source\TextProgressCtrl.cpp
//Download by http://www.NewXing.com // TextProgressCtrl.cpp : implementation file // // Written by Chris Maunder (chrismaunder@codeguru.com) // Copyright 1998. // // Modified : 26/05/98 Jeremy Davis, jmd@jvf.co.uk // Added colour routines // // TextProgressCtrl is a drop-in replacement for the standard // CProgressCtrl that displays text in a progress control. // // This code may be used in compiled form in any way you desire. This // file may be redistributed by any means PROVIDING it is not sold for // profit without the authors written consent, and providing that this // notice and the authors name is included. If the source code in // this file is used in any commercial application then an email to // the me would be nice. // // This file is provided "as is" with no expressed or implied warranty. // The author accepts no liability if it causes any damage to your // computer, causes your pet cat to fall ill, increases baldness or // makes you car start emitting strange noises when you start it up. // // Expect bugs. // // Please use and enjoy. Please let me know of any bugs/mods/improvements // that you have found/implemented and I will fix/incorporate them into this // file. #include "stdafx.h" #include "TextProgressCtrl.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CTextProgressCtrl CTextProgressCtrl::CTextProgressCtrl() { m_nPos = 0; m_nStepSize = 1; m_nMax = 100; m_nMin = 0; m_colFore = ::GetSysColor(COLOR_HIGHLIGHT); m_colBk = ::GetSysColor(COLOR_MENU); m_colTextFore = ::GetSysColor(COLOR_MENUTEXT); m_colTextBk = ::GetSysColor(COLOR_WINDOW); m_bShowText = TRUE; m_nBarWidth = -1; } CTextProgressCtrl::~CTextProgressCtrl() { } BEGIN_MESSAGE_MAP(CTextProgressCtrl, CProgressCtrl) //{{AFX_MSG_MAP(CTextProgressCtrl) //ON_WM_ERASEBKGND() ON_WM_PAINT() ON_WM_SIZE() //}}AFX_MSG_MAP END_MESSAGE_MAP() #include "winuser.h" ///////////////////////////////////////////////////////////////////////////// // CTextProgressCtrl message handlers BOOL CTextProgressCtrl::OnEraseBkgnd(CDC* /*pDC*/) { return TRUE; } void CTextProgressCtrl::OnSize(UINT nType, int cx, int cy) { CProgressCtrl::OnSize(nType, cx, cy); m_nBarWidth = -1; // Force update if SetPos called } void CTextProgressCtrl::OnPaint() { if (m_nMin >= m_nMax) return; CRect LeftRect, RightRect, ClientRect; GetClientRect(ClientRect); double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin)); CPaintDC dc(this); // device context for painting (if not double buffering) LeftRect = RightRect = ClientRect; LeftRect.right = LeftRect.left + (int)((LeftRect.right - LeftRect.left)*Fraction); dc.FillSolidRect(LeftRect, m_colFore); RightRect.left = LeftRect.right; dc.FillSolidRect(RightRect, m_colBk); if (m_bShowText) { CString str; if (m_strText.GetLength()) str = m_strText; else str.Format(_T("%d%%"), (int)(Fraction*100.0)); dc.SetBkMode(TRANSPARENT); CRgn rgn; rgn.CreateRectRgn(LeftRect.left, LeftRect.top, LeftRect.right, LeftRect.bottom); dc.SelectClipRgn(&rgn); dc.SetTextColor(m_colTextBk); HFONT hSysFont = ( HFONT )GetStockObject( DEFAULT_GUI_FONT ); CFont* pFont = CFont::FromHandle( hSysFont ); CFont* pOldFont = dc.SelectObject( pFont ); dc.DrawText(str, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); rgn.DeleteObject(); rgn.CreateRectRgn(RightRect.left, RightRect.top, RightRect.right, RightRect.bottom); dc.SelectClipRgn(&rgn); dc.SetTextColor(m_colTextFore); dc.DrawText(str, ClientRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); dc.SelectObject( pOldFont ); pFont->DeleteObject(); } } void CTextProgressCtrl::SetForeColour(COLORREF col) { m_colFore = col; } void CTextProgressCtrl::SetBkColour(COLORREF col) { m_colBk = col; } COLORREF CTextProgressCtrl::GetForeColour() { return m_colFore; } COLORREF CTextProgressCtrl::GetBkColour() { return m_colBk; } ///////////////////////////////////////////////////////////////////////////// // CTextProgressCtrl message handlers void CTextProgressCtrl::SetShowText(BOOL bShow) { if (::IsWindow(m_hWnd) && m_bShowText != bShow) Invalidate(); m_bShowText = bShow; } void CTextProgressCtrl::SetRange(int nLower, int nUpper) { m_nMax = nUpper; m_nMin = nLower; } int CTextProgressCtrl::SetPos(int nPos) { if (!::IsWindow(m_hWnd)) return -1; int nOldPos = m_nPos; m_nPos = nPos; CRect rect; GetClientRect(rect); double Fraction = (double)(m_nPos - m_nMin) / ((double)(m_nMax - m_nMin)); int nBarWidth = (int) (Fraction * rect.Width()); if (nBarWidth != m_nBarWidth) { m_nBarWidth = nBarWidth; RedrawWindow(); } return nOldPos; } int CTextProgressCtrl::StepIt() { return SetPos(m_nPos + m_nStepSize); } int CTextProgressCtrl::OffsetPos(int nPos) { return SetPos(m_nPos + nPos); } int CTextProgressCtrl::SetStep(int nStep) { int nOldStep = m_nStepSize; m_nStepSize = nStep; return nOldStep; }